From: Martin Buck Date: Tue, 13 Nov 2018 22:58:43 +0000 (+0100) Subject: Start new track segments on timer start events X-Git-Tag: archive/raspbian/1.10.0+ds-2+rpi1~1^2~12^2~8^2~46^2 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22Program/%22http:/www.example.com/cgi/%22https:/%22Program?a=commitdiff_plain;h=f859e31d0aff40adf3a467b4a38b7c2fcc6771e7;p=gpsbabel.git Start new track segments on timer start events Insert track segment separators when encountering a timer start event in a FIT file (usually caused by manually pushing the start button). This way, pauses in a FIT file don't appear as continuous tracks. Also adapt reference tracks by adding suitable tags to please "make check"/testo. --- diff --git a/garmin_fit.cc b/garmin_fit.cc index b95a18019..ad949f477 100644 --- a/garmin_fit.cc +++ b/garmin_fit.cc @@ -30,6 +30,7 @@ const int kIdDeviceSettings = 0; const int kIdLap = 19; const int kIdRecord = 20; +const int kIdEvent = 21; // constants for message fields // for all global IDs @@ -56,12 +57,18 @@ const int kFieldPower = 7; const int kFieldTemperature = 13; const int kFieldEnhancedSpeed = 73; const int kFieldEnhancedAltitude = 78; +// for global ID: event +const int kFieldEvent = 0; +const int kEnumEventTimer = 0; +const int kFieldEventType = 1; +const int kEnumEventTypeStart = 0; // For developer fields as a non conflicting id const int kFieldInvalid = 255; static char* opt_allpoints = nullptr; static int lap_ct = 0; +static bool new_trkseg = false; static arglist_t fit_args[] = { @@ -346,6 +353,7 @@ fit_read_field(fit_field_t* f) MYNAME, f->type, f->size, fit_data.len); } switch (f->type) { + case 0: // enum case 1: // sint8 case 2: // uint8 if (f->size == 1) { @@ -414,6 +422,8 @@ fit_parse_data(fit_message_def* def, int time_offset) int32_t endlat = 0x7fffffff; int32_t endlon = 0x7fffffff; uint32_t starttime = 0; // ??? default ? + uint8_t event = 0xff; + uint8_t eventtype = 0xff; char cbuf[10]; Waypoint* lappt; // WptPt in gpx @@ -593,6 +603,23 @@ fit_parse_data(fit_message_def* def, int time_offset) // end of case def->global_id = kIdLap break; + case kIdEvent: + switch (f->id) { + case kFieldEvent: + if (global_opts.debug_level >= 7) { + debug_print(7,"%s: parsing fit data: event=%d\n", MYNAME, val); + } + event = val; + break; + case kFieldEventType: + if (global_opts.debug_level >= 7) { + debug_print(7,"%s: parsing fit data: eventtype=%d\n", MYNAME, val); + } + eventtype = val; + break; + } // switch (f->id) + // end of case def->global_id = kIdEvent + break; default: if (global_opts.debug_level >= 1) { debug_print(1, "%s: unrecognized/unhandled global ID for GARMIN FIT: %d\n", MYNAME, def->global_id); @@ -652,8 +679,21 @@ fit_parse_data(fit_message_def* def, int time_offset) if (temperature != 0x7f) { WAYPT_SET(waypt, temperature, temperature); } + if (new_trkseg) { + waypt->wpt_flags.new_trkseg = 1; + new_trkseg = false; + } track_add_wpt(fit_data.track, waypt); break; + case kIdEvent: // event message + if (event == kEnumEventTimer && eventtype == kEnumEventTypeStart) { + // Start event, start new track segment. Note: We don't do this + // on stop events because some GPS devices seem to generate a last + // trackpoint after the stop event and that would erroneously get + // assigned to the next segment. + new_trkseg = true; + } + break; } } diff --git a/reference/track/garmin-edge-800-output.gpx b/reference/track/garmin-edge-800-output.gpx index 7b66c8c96..994757c7d 100644 --- a/reference/track/garmin-edge-800-output.gpx +++ b/reference/track/garmin-edge-800-output.gpx @@ -244,6 +244,8 @@ 0.000000 + + 517.200 @@ -2434,6 +2436,8 @@ 0.000000 + + 542.000 @@ -2499,6 +2503,8 @@ 0.000000 + + 544.000 @@ -3479,6 +3485,8 @@ 0.000000 + + 526.400 @@ -3499,6 +3507,8 @@ 0.000000 + + 526.400 @@ -3659,6 +3669,8 @@ 0.000000 + + 528.400 @@ -3674,6 +3686,8 @@ 0.000000 + + 528.400 diff --git a/reference/track/garmin-forerunner-10-output.gpx b/reference/track/garmin-forerunner-10-output.gpx index 8eeab2bb3..274934dd6 100644 --- a/reference/track/garmin-forerunner-10-output.gpx +++ b/reference/track/garmin-forerunner-10-output.gpx @@ -67,6 +67,8 @@ 0.376000 + + 1.953000 @@ -571,6 +573,8 @@ 0.091000 + + 3.568000 @@ -591,6 +595,8 @@ 0.123000 + + 2.382000 @@ -711,6 +717,8 @@ 0.164000 + + 3.186000 @@ -859,6 +867,8 @@ 0.177000 + + 2.474000 @@ -1143,6 +1153,8 @@ 0.079000 + + 3.287000 diff --git a/reference/track/wahoo-element-bolt.gpx b/reference/track/wahoo-element-bolt.gpx index a79856011..ca1b1de8f 100644 --- a/reference/track/wahoo-element-bolt.gpx +++ b/reference/track/wahoo-element-bolt.gpx @@ -1578,6 +1578,8 @@ 1.151000 + + 116.400 @@ -1608,6 +1610,8 @@ 0.000000 + + 117.000 @@ -5483,6 +5487,8 @@ 0.000000 + + 168.200